const path = require('path')
const config = require(path.join(__dirname,"../config"))
const productModel = require(path.join(__dirname,"../model/productModel"))
const cartModel = require(path.join(__dirname,"../model/cartModel"))

/**
 * 添加购物车
 */
exports.add = (req,res,next) => {
    // 商品id
    const goodsId = req.query.goodsId
    // 数量
    const amount = parseInt(req.query.amount || 1)

    // 判断是否登录了，如果登录了把数据保存在session中，如果没有登录保存在浏览器的cookies中
    if (req.session.user){ // 登录了
        cartModel.add(req.session.user.id,goodsId,amount).then(()=>{
            // 重定向到添加成功的路由
            res.redirect(`/cart/success?goodsId=${goodsId}&amount=${amount}`)
            /**
            productModel.getProduct(goodsId,true).then(goods=>{
                // 商品基本信息
                res.locals.goods = {
                    goodsId,
                    name:goods.name,
                    thumbnail:goods.thumbnail,
                    amount
                }

                // 渲染添加购物车成功页面
                res.render(path.join(__dirname,"../views/cart-add"))
            })
            */
        }).catch(err=>next(err))
    } else { // 没有登录，通过 cookie-parser 来操作浏览器端的cookie
        // 约定cookie中保存的数据格式为JSON格式的字符串 "[{"goodsId":701,"amount":3},{"goodsId":78,"amount":2}]"

        // 1、取出之前保存在浏览器中的cookie
        const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'

        // 2、转成js对象
        const cartList = JSON.parse(cartCookie)

        // 3、更改商品的数量
        /**
        let isExist = false
        cartList.forEach(item=>{
            if (item.goodsId === goodsId){
                item.amount += amount

                isExist = true
            }
        })

        if (!isExist) cartList.push({goodsId,amount})
        */

        // ES6的新方法
        const item = cartList.find(item => item.goodsId === goodsId)
        if (item) { // 找到了
            item.amount += amount
        } else { // 没找到
            cartList.push({goodsId,amount})
        }

        // 返回给客户端，保存起来
        res.cookie(config.cookie.cart_cookie_key, JSON.stringify(cartList),{ expires: new Date(Date.now() + config.cookie.expires_time), httpOnly: true })
        
        // 查询基本的商品信息
        /** 
        productModel.getProduct(goodsId,true).then(data=>{
            // 商品基本信息
            res.locals.goods = {
                goodsId:data.id,
                name:data.name,
                thumbnail:data.thumbnail,
                amount
            }

            // 渲染添加购物车成功页面
            res.render(path.join(__dirname,"../views/cart-add"))
        }).catch(err=>next(err))
        */
        
        // 重定向到添加成功的路由
        res.redirect(`/cart/success?goodsId=${goodsId}&amount=${amount}`)
    }
}

/**
 * 添加成功，渲染成功页面
 */
exports.addSuccess = (req,res) => {
    const {goodsId,amount} = req.query

    productModel.getProduct(goodsId,true).then(data=>{
        // 商品基本信息
        res.locals.goods = {
            goodsId:data.id,
            name:data.name,
            thumbnail:data.thumbnail,
            amount
        }

        // 渲染添加购物车成功页面
        res.render(path.join(__dirname,"../views/cart-add"))
    }).catch(err=>next(err))
}

/**
 * 查询购物车页面
 */
exports.index = (req,res) => {
    const {goodsId,amount} = req.query

    res.render(path.join(__dirname,"../views/cart"))
}

/**
 * 查询购物车列表数据
 */
exports.find = (req,res) => {
    if (req.session.user) { // 已登录
        cartModel.find(req.session.user.id).then(list=>{
            res.json(list)
        }).catch(err=>{
            res.json([])
        })
    } else { // 未登录
        //1、获取浏览器cookie中保存的商品信息
        const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'

        //2、转成js数组
        const cartList = JSON.parse(cartCookie)

        //3、根据cartList生成对应个数的Promise数组
        const promiseArray = cartList.map((item,i)=>{
            return productModel.getProduct(item.goodsId,true)
        })

        //4、发送请求，获取商品信息
        Promise.all(promiseArray).then(results => {
            const list = results.map((item,i) => ({
                id:item.id, // 商品ID
                name:item.name, // 商品名称
                thumbnail:item.thumbnail, // 商品图片
                price:item.price, // 商品价格
                amount:cartList[i].amount // 商品数量
            }))
            
            res.json(list)
        }).catch(err=>{ //失败
            res.json([])
        })
    }
}

/** 修改购物车中的商品数量 */
exports.edit = (req,res) => {
    //1、解构赋值出goodsId和amount
    const {goodsId,amount} = req.body

    if (req.session.user) { // 已登录
        cartModel.edit(req.session.user.id,goodsId,amount).then(()=>{
            res.json({status:0,message:'更新商品数量成功'})
        }).catch(err=>{
            res.json({status:1,message:'更新商品数量失败'})
        })
    } else { // 未登录
        //2、获取浏览器cookies中保存的商品信息
        const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'
        const cartList = JSON.parse(cartCookie)

        //3、对cartList中的商品信息进行更改
        const item = cartList.find(item=>item.goodsId === goodsId)
        item.amount = amount

        //4、通过响应头重置cookie的信息
        res.cookie(config.cookie.cart_cookie_key,JSON.stringify(cartList),{ expires: new Date(Date.now() + config.cookie.expires_time), httpOnly: true })

        //5、响应数据给浏览器
        res.json({status:0,message:'更新商品数量成功'})
    }
}

/**
 * 删除购物车中的商品
 */
exports.delete = (req,res) => {
    //1、解构赋值出goodsId
    const {goodsId} = req.body

    if (req.session.user) { // 已登录
        cartModel.delete(req.session.user.id,goodsId).then(()=>{
            res.json({status:0,message:'删除商品数量成功'})
        }).catch(err=>{
            res.json({status:1,message:'删除商品数量失败'})
        })
    } else {
        //2、获取浏览器cookies中保存的商品信息
        const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'
        const cartList = JSON.parse(cartCookie)

        //3、对cartList中的商品信息进行删除
        const index = cartList.findIndex(item=>item.goodsId === goodsId)
        cartList.splice(index,1)

        //4、通过响应头重置cookie的信息
        res.cookie(config.cookie.cart_cookie_key,JSON.stringify(cartList),{ expires: new Date(Date.now() + config.cookie.expires_time), httpOnly: true })

        //5、响应数据给浏览器
        res.json({status:0,message:'删除商品数量成功'})
    }
}